/**
 * 第11章 用Optional取代null
 * 代码清单-p2ch11a-243页a：null-安全的第一次尝试：深层质疑 {@link top.kaoshanji.p2ch11a.OptionalMain#getCarInsuranceNameNullSafeV1(top.kaoshanji.p2ch11a.PersonV1)}
 * 代码清单-p2ch11a-244页a：null-安全的第二种尝试：过多的退出语句 {@link top.kaoshanji.p2ch11a.OptionalMain#getCarInsuranceNameNullSafeV2(top.kaoshanji.p2ch11a.PersonV1)}
 * 代码清单-p2ch11a-251页a：使用Optional获取car的insurance名称 {@link top.kaoshanji.p2ch11a.OptionalMain#getCarInsuranceName(java.util.Optional)}
 * 代码清单-p2ch11a-253页a：找出person列表所使用的保险公司名称（不含重复项） {@link top.kaoshanji.p2ch11a.OptionalMain#getCarInsuranceNames(java.util.List)}
 * 代码清单-p2ch11a-256页a：两个Optional对象的组合第一个版本 {@link top.kaoshanji.p2ch11a.OptionalMain#nullSafeFindCheapestInsurance(java.util.Optional, java.util.Optional)}
 * 代码清单-p2ch11a-256页b：两个Optional对象的组合第二个版本 {@link top.kaoshanji.p2ch11a.OptionalMain#nullSafeFindCheapestInsuranceQuiz(java.util.Optional, java.util.Optional)}
 * 代码清单-p2ch11a-257页a：对Optional对象进行过滤 {@link top.kaoshanji.p2ch11a.OptionalMain#getCarInsuranceName(java.util.Optional, int)}
 * 代码清单-p2ch11a-259页a：将String转换为Integer，并返回一个Optional对象 {@link top.kaoshanji.p2ch11a.ReadPositiveIntParam#s2i(java.lang.String)}
 * 代码清单-p2ch11a-261页a：以命令式编程的方式从属性中读取 duration 值 {@link top.kaoshanji.p2ch11a.ReadPositiveIntParam#readDurationImperative(java.util.Properties, java.lang.String)}
 * 代码清单-p2ch11a-261页b：使用Optional从属性中读取duration {@link top.kaoshanji.p2ch11a.ReadPositiveIntParam#readDurationWithOptional(java.util.Properties, java.lang.String)}
 * author kaoshanji
 * ^_^
 * create time 2025/2/13 16:30
 */
package top.kaoshanji.p2ch11a;